package com.wangcanxuan.www.util;

import java.math.BigInteger;
import java.security.MessageDigest;
import java.time.*;
import java.util.Date;
import java.util.UUID;

/**
 * 安全工具类
 *
 * @author HHLJ
 * @date 2022/03/15
 */
public class SecurityUtil {
    /**
     * 工具类不对外暴露构造器
     */
    private SecurityUtil() {

    }

    /**
     * 方法名：getSha1Encrypt
     * 作用：为传进的数据进行SHA1算法加密
     * 测试：经测试无bug
     * 想法：规定密码必须为8-16位且只能有A-Za-z0-9_，
     *
     * @param data 数据
     * @return {@link String}
     */
    public static String getSha1Encrypt(String data) {
        //定义一个encryptedString存储加密后的字符串
        String encryptedString = null;
        try {
            MessageDigest sha1 = MessageDigest.getInstance("SHA1");
            sha1.update(data.getBytes());
            //使用16进制
            encryptedString = new BigInteger(1, sha1.digest()).toString(16);
        } catch (Exception e) {
            LoggerUtil.getLogger().severe("加密失败！");
        }
        return encryptedString;
    }

    /**
     * uuid创建主键
     *
     * @return {@link String}
     */
    public static String uuidCreateId() {
        UUID uuid = UUID.randomUUID();
        return String.valueOf(uuid);
    }

    /**
     * 获得倒计时
     *
     * @param acceptTime 接受时间
     * @return {@link String}
     */
    public static String getCountdownTime(LocalDateTime acceptTime) {
        if (ValidateUtil.isNull(acceptTime)) {
            return null;
        }
        // 通过时间戳获得昨天的日期
        Date finishTimeDate = new Date(System.currentTimeMillis() - 86400000);
        // 通过Date转换为LocalDateTime
        LocalDateTime finishTime = finishTimeDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
        // 用Duration来得到日期间相差多少
        Duration duration = Duration.between(finishTime, acceptTime);
        // 相差的小时数
        long hours = duration.toHours() % 24;
        // 相差的分钟数
        long minutes = duration.toMinutes() % 60;
        // 相差秒数
        long seconds = duration.getSeconds() % 60;
        // 相差毫秒数
        long millis = duration.toMillis() % 1000;
        if (duration.toMillis() > 0) {
            return hours + "时" + minutes + "分" + seconds + "秒" + millis + "毫秒";
        } else {
            return "";
        }

    }


    /**
     * 持续时间
     *
     * @param localDateTime 当地日期时间
     * @return {@link String}
     */
    public static String getTime(LocalDateTime localDateTime) {
        // 获得当前时间
        LocalDateTime now = LocalDateTime.now();
        // 用Duration来得到日期间相差多少
        Duration duration = Duration.between(now, localDateTime);
        // 相差的天数
        long days = duration.toDays();
        // 相差的小时数
        long hours = duration.toHours() % 24;
        // 相差的分钟数
        long minutes = duration.toMinutes() % 60;
        // 相差秒数
        long seconds = duration.getSeconds() % 60;
        // 相差毫秒数
        long millis = duration.toMillis() % 1000;

        return days + "日" + hours + "时" + minutes + "分" + seconds + "秒" + millis + "毫秒";

    }

    /**
     * 昨天日期时间
     *
     * @return {@link LocalDateTime}
     */
    public static LocalDateTime yesterdayDateTime() {
        return LocalDateTime.now().plusDays(-1);
    }

    /**
     * 小于一天
     *
     * @param signDate 签署日期
     * @return boolean
     */
    public static boolean isLessThanOneDay(LocalDateTime signDate) {
        LocalDateTime now = LocalDateTime.now();
        // 检测签到时长是否超过一天
        Duration duration = Duration.between(signDate, now);
        return duration.toMillis() <= 86400000;
    }

}
